class EightQueens: #解决8皇后问题的类

    def __init__(self):
        self.__Q=[-1 for i in range(0,8)] #8个皇后的初始位置，还没放下，记作-1
        self.__flag1=0
        return

    def resetQueens(self):
        self.__Q=[-1 for i in range(0,8)] #8个皇后的初始位置，还没放下，记作-1
        self.__flag1=0
        return
    
    def __lastQueen(self): #寻找最后一个已经放入棋盘的皇后，都没有放下返回-1
        for i in range(0,8):
            if self.__Q[i]==-1:
                return i-1
        return 7


    def __isOk(self): #考察已经放在棋盘的皇后能否共存
        for i in range(0,8):
            for j in range(i+1,8):
                if self.__Q[i]==-1 or self.__Q[j]==-1: 
                    pass #如果其中一个皇后没有放进棋盘，就可以过去了。
                else:
                    if self.__Q[i]==self.__Q[j] or abs(self.__Q[i]-self.__Q[j])== abs(i-j):
                    #如果同行或同列或行列位置等距离，则不可共存，返回False    
                        return False
        return True

    def __getChessboard(self):
        #获取当前棋盘,为一个8个列表组成的列表，没有皇后显示"*"，有皇后显示"Q"
        result=[['*','*','*','*','*','*','*','*',] for i in range(0,8)]
        for i in range(0,8):
            if self.__Q[i]>-1:
                result[i][self.__Q[i]]='Q'
        return result

    def __putNextQueen(self):#放下一个皇后到棋盘
        n=self.__lastQueen()
        if n==7:
            return False
        else:
            self.__Q[n+1]=0
        return True

    def __movLastQueen(self):#移动最后一个皇后
        n=self.__lastQueen()
        if n==0 and self.__Q[n]==7:
            return False #已经无法移动了
        if n==-1:
            return False #棋盘上没有皇后，返回
        if self.__Q[n]<7:
            self.__Q[n]+=1
            return True
        else:
            self.__Q[n]=-1
            return self.__movLastQueen()

    def movLastQueen(self):
        if self.__flag1>0:
            pass
            #print("already get a solution!")
        return self.__movLastQueen()

    def solveStep(self):#解决8皇后问题，一步一步来，每步打印结果，测试用
        if self.__isOk():
            print("Ok,add Queen or success")
            if self.__lastQueen()==7:
                self.printChessboard()
                return True
            else:
                self.__putNextQueen()
        else:
            print("Not Ok,move Queen")
            self.__movLastQueen()
        self.printChessboard()

    def solve(self):#解决8皇后问题，并打印出结果
        if self.__isOk():
            if self.__lastQueen()==7:
                self.printChessboard()
                return True
            else:
                self.__putNextQueen()
                return self.solve()
        else:
            if self.movLastQueen():#尝试移动皇后，如果已经不行，就返回False
                return self.solve()
            else:
                return False

    def allSolve(self):#获取所有答案
        self.resetQueens()
        b=True
        while(b):
            print('===============================')
            print(self.__flag1)
            b=self.solve()
            print('===============================')
            self.__flag1+=1
            self.movLastQueen()
            #print(b)
        self.__flag1=0
        print('End successfully')
        return

    def printChessboard(self):#打印棋盘
        result=self.__getChessboard()
        for i in range(0,8):
            print("".join(result[i]))
        return

q=EightQueens()
try:
    pass
    q.allSolve()
except:
    print("There's still error")
#q.solve()
